package ar.uba.is2.ec.matem.motor.impl;

import java.util.Collection;
import java.util.Date;

import ar.uba.is2.common.mensaje.contenido.Dato;
import ar.uba.is2.ec.config.Contexto;
import ar.uba.is2.ec.matem.datos.EstadoMeteorologico;
import ar.uba.is2.ec.matem.datos.Medicion;
import ar.uba.is2.ec.matem.datos.ResultadoDeModelo;

public class ReglaPromedio extends ReglaAbstracta {

	@Override
	public ResultadoDeModelo aplicar(Collection<Dato> datos) {
		
		int sumaOrdinal = 0;
		
		for (Dato dato : datos) {
			EstadoMeteorologico estado;
			if (dato instanceof Medicion) {
				estado = aplicarMedicion((Medicion)dato);
			} else {
				estado = aplicarResultado((ResultadoDeModelo)dato);
			}
			
			sumaOrdinal += estado.ordinal();
			
		}

		sumaOrdinal = sumaOrdinal / datos.size();
		
		EstadoMeteorologico estadoResultado = EstadoMeteorologico.values()[sumaOrdinal];
		
		ResultadoDeModelo resultado = new ResultadoDeModelo();
		
		resultado.setId(ResultadoDeModelo.proxId());
		resultado.setFecha(new Date());
		resultado.setValor(estadoResultado);
		resultado.setCoordenada(Contexto.instance.getConfiguracionGeneralEC().getCoordenada());

		return resultado;
	}


	@Override
	protected EstadoMeteorologico aplicarMedicion(Medicion medicion) {
		EstadoMeteorologico resultado = null;
		
		Float valor = medicion.getValor();
		
		if (valor <= 0){
			resultado = EstadoMeteorologico.SIN_RESULTADO;
		} else if (valor < 50) {
			resultado = EstadoMeteorologico.SOL;
		} else if (valor < 80) {
			resultado = EstadoMeteorologico.LLUVIA;
		} else if (valor < 100) {
			resultado = EstadoMeteorologico.HURACAN;
		} else {
			resultado = EstadoMeteorologico.EXPLOSION_PLANETARIA;
		}

		return resultado;
	}

}
